<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .outer {
        width: 300px;
        border: 1px solid black;
        height: 30px;
      }

      .inner {
        width: 100%;
        height: 100%;
        background-color: green;
      }
    </style>
  </head>
  <body>
    <input type="file" id="pic" /> <button id="btn">上传</button> <br />

    进度条:
    <div class="outer">
      <div class="inner">
        <span class="text"></span>
      </div>
    </div>
    <script>
      btn.onclick = function () {
        // 获取上传文件的表单项
        const pic = document.querySelector('#pic')
        // 获取要上传的文件对象
        const file = pic.files[0]

        // 注意: 要上传文件,其实就是把这个文件对象,添加到formdata中.以前有标表单,formdata会自动把这个文件对象添加到formdata中.现在没有表单了,所以程序员需要手动将这个文件对象添加到formdata中
        const formdata = new FormData() // 没有form表单,就可以不传入form对象
        formdata.append('xxx', file)

        // 发送ajax请求

        const xhr = new XMLHttpRequest()
        xhr.open('post', 'http://localhost:5000/test')

        // 获取inner和span
        const inner = document.getElementsByClassName('inner')[0]
        const span = document.getElementsByClassName('text')[0]
        // 监听文件上传的进度
        xhr.upload.onprogress = function (e) {
          // 文件上传过程中,这个事件处理函数会不断被调用
          // console.log('已经上传了:', e.loaded, '个字节')
          // console.log('文件总大小为:', e.total, '个字节')
          // 计算百分比
          const ratio = (e.loaded / e.total) * 100

          inner.style.width = ratio + '%'
          span.innerText = ratio + '%'
        }

        xhr.send(formdata)
      }
    </script>
  </body>
</html>
